﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ServirMovil.ServicioWS;
using ServirMovil.Clases.Negocio;
using ServirMovil.Formularios;
using ServirMovil.Clases.Movil;
using GS1.Library;
using ServirMovil.Herramientas;

namespace ServirMovil
{
    public partial class frmPrestamoLote : frmBase
    {
        #region --- Variables y Constantes ---
        private Etiqueta[] listaEtiqueta;

        private const string CAMPO_IDUSUARIO = "idUsuario";
        private const string CAMPO_NOMBRE = "nombre";
        #endregion

        #region --- Constructor ---
        public frmPrestamoLote()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos formulario ---
        private void frmPrestamoLote_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void mnuGrabar_Click(object sender, EventArgs e)
        {
            grabarLote();
        }

        private void btnScannear_Click(object sender, EventArgs e)
        {
            GS1.PsionRFID.ListaTag listaTag = new GS1.PsionRFID.ListaTag();
            listaTag.Add(new GS1.PsionRFID.Tag() { Epc = "12312312sdfddad" });

            procesarListadoExpediente(listaTag);
        }
        #endregion

        #region --- Eventos LectorRFID ---
        protected override void OnFinCapturaData(GS1.PsionRFID.ListaTag listaTag)
        {
            procesarListadoExpediente(listaTag);
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                MetodosAplicacion.configuraFormulario(this);

                cargarUsuario();
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void cargarUsuario()
        {
            Usuario[] listaUsuario = null;

            // Obtener listado de analistas del servicio web
            using (Interfase interfase = new Interfase())
            {
                listaUsuario = interfase.listarUsuario();
            }

            // Estableciendo fuente de datos de combo usuario
            this.cboUsuario.DataSource = listaUsuario;
            this.cboUsuario.ValueMember = CAMPO_IDUSUARIO;
            this.cboUsuario.DisplayMember = CAMPO_NOMBRE;
        }

        private bool validarEntradas()
        {
            if (this.lvwListado.Items.Count == 0)
            {
                Util.CampoNecesario(this.lvwListado, "Debe leer por lo menos un expediente a prestar");
                return true;
            }
            return false;
        }

        private void grabarLote()
        {
            Prestamo[] listaPrestamo = null;
            Prestamo prestamo = null;
            bool resultado =false;
            int contador =0;
            int totalElegidos = 0;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Desactiva el lector RFID
                quitarEventoGatillo();

                // Validar los campos a grabar
                if (validarEntradas()) { return; }

                // Valida si hay por lo menos un item elegido a prestar
                foreach (ListViewItem item in this.lvwListado.Items)
                {
                    if (item.Checked) { totalElegidos++; }
                }

                if (totalElegidos == 0)
                {
                    Util.CampoNecesario(this.lvwListado, "Debe seleccionar por lo menos un expediente a prestar");
                    return;
                }

                // Instanciando y dimensionando variable listadoPrestamo
                listaPrestamo = new Prestamo[totalElegidos];

                for (int contando = 0; contando < this.lvwListado.Items.Count; contando++)
                {
                    if (this.lvwListado.Items[contando].Checked)
                    {
                        prestamo = new Prestamo();

                        // Estableciendo parametros de la aplicacion
                        prestamo.sede = ParametrosAplicacion.SEDE_ACTUAL;
                        prestamo.usuario = ParametrosAplicacion.USUARIO_ACTUAL;
                        prestamo.estado = Constantes.ETIQUETA_PRESTADO;

                        // Estableciendo usuario a prestar
                        prestamo.usuarioSolicitante = (Usuario)this.cboUsuario.SelectedItem;

                        // Estableciendo etiqueta
                        prestamo.etiqueta = this.listaEtiqueta[contando];

                        // Agregando prestamo al listado
                        listaPrestamo[contador] = prestamo;
                        contador++;
                    }
                }

                /*
                foreach (Etiqueta etiqueta in this.listaEtiqueta)
                {
                    prestamo = new Prestamo();

                    // Estableciendo parametros de la aplicacion
                    prestamo.sede = ParametrosAplicacion.SEDE_ACTUAL;
                    prestamo.usuario = ParametrosAplicacion.USUARIO_ACTUAL;

                    // Estableciendo usuario a prestar
                    prestamo.usuarioSolicitante = (Usuario)this.cboUsuario.SelectedItem;

                    // Estableciendo etiqueta
                    prestamo.etiqueta = etiqueta;

                    // Agregando prestamo al listado
                    listaPrestamo[contador] = prestamo;
                }
                */
                using (Interfase interfase = new Interfase())
                {
                    resultado = interfase.registrarPrestamoLote(listaPrestamo, ParametrosAplicacion.SEDE_ACTUAL);
                }

                // Evaluar resultado
                if (resultado)
                {
                    Util.ShowMessageboxInfo("Préstamo registrado correctamente", this.lblTitulo.Text);

                    limpiarTodo();
                }
                else
                {
                    Util.ShowMessageboxExclamacion("No se logro registrar Préstamo", this.lblTitulo.Text);
                }
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                // Activa el lector RFID
                agregarEventoGatillo();

                Cursor.Current = Cursors.Default;
            }
        }

        private void limpiarTodo()
        {
            // Limpiando listado de expedientes
            this.lvwListado.Items.Clear();

            // Seleccionado el primer analista
            this.cboUsuario.SelectedIndex = 0;
        }

        private void procesarListadoExpediente(GS1.PsionRFID.ListaTag listaTag)
        {
            Etiqueta[] listaEtiquetaFiltrado = null;
            int indice = 0;
            string mensajeExpedientesProblema = string.Empty;

            try
            {
                // Si no hay epc leidos, entonces salir
                if (listaTag.Count == 0) { return; }

                // Desactiva el lector RFID
                quitarEventoGatillo();

                Cursor.Current = Cursors.WaitCursor;

                // Filtrar Listado de Tag repetidos
                listaTag = filtrarListadoTagEpc(listaTag);

                // Dimensiona arreglo de expedientes
                listaEtiquetaFiltrado = new Etiqueta[listaTag.Count];

                // Se carga lista de expedientes a evaluar en servicio Web
                foreach (GS1.PsionRFID.Tag tag in listaTag)
                {
                    listaEtiquetaFiltrado[indice] = new Etiqueta { epc = tag.Epc };
                    indice++;
                }

                // Obtener el listado de etiquetas-expedientes
                using (Interfase interfase = new Interfase())
                {
                    this.listaEtiqueta = interfase.buscarExpedienteEpcListado(listaEtiquetaFiltrado);
                }

                // Verificar que almenos exista una etiqueta en el listado
                if (this.listaEtiqueta != null && this.listaEtiqueta.Length > 0)
                {
                    // Actualizando del control
                    this.lvwListado.BeginUpdate();
                    this.lvwListado.Items.Clear();

                    foreach (Etiqueta etiquetaResultado in this.listaEtiqueta)
                    {
                        if (etiquetaResultado.estadoPrestamo.Equals(Constantes.ETIQUETA_NOPRESTADO)|
                            etiquetaResultado.estadoPrestamo.Equals(Constantes.ETIQUETA_CREADO)|
                            etiquetaResultado.estadoPrestamo.Equals(Constantes.ETIQUETA_CREADA_LEIDA))
                        {
                            // Agregando item (numero-anio-tomo) de expediente a listado
                            this.lvwListado.Items.Add(new ListViewItem
                            {
                                Text = string.Format(Constantes.FORMATO_EXPEDIENTE_NUMEROANIOTOMO, etiquetaResultado.expediente.numero,
                                                                                                   etiquetaResultado.expediente.anio,
                                                                                                   etiquetaResultado.nroTomo),
                                Checked = true
                            });
                        }
                        else
                        {
                            mensajeExpedientesProblema += string.Format(Constantes.FORMATO_EXPEDIENTE_NUMEROANIOTOMO, etiquetaResultado.expediente.numero,
                                                                                                   etiquetaResultado.expediente.anio,
                                                                                                   etiquetaResultado.nroTomo) + ",";

                            // Agregando item (numero-anio-tomo) de expediente a listado
                            this.lvwListado.Items.Add(new ListViewItem
                            {
                                Text = string.Format(Constantes.FORMATO_EXPEDIENTE_NUMEROANIOTOMO, etiquetaResultado.expediente.numero,
                                                                                                   etiquetaResultado.expediente.anio,
                                                                                                   etiquetaResultado.nroTomo),
                                Checked = false,
                                BackColor = Color.Silver
                            });
                        }
                    }

                    // Confirmar Actualizacion del control
                    this.lvwListado.EndUpdate();

                    // Validar si hay mensaje de error
                    if (mensajeExpedientesProblema.Length > 0)
                    {
                        mensajeExpedientesProblema = mensajeExpedientesProblema.Substring(0, mensajeExpedientesProblema.Length - 1);
                        mensajeExpedientesProblema = "Por favor retire los siguientes expedientes : " + 
                                                     mensajeExpedientesProblema;

                        Util.ShowMessageboxExclamacion(mensajeExpedientesProblema, this.lblTitulo.Text);
                    }

                    // Si hay mensaje de error entonces desabilitar boton grabar
                    this.mnuGrabar.Enabled = mensajeExpedientesProblema.Length == 0;
                }
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                // Activa el lector RFID
                agregarEventoGatillo();

                Cursor.Current = Cursors.Default;
            }
        }

        private GS1.PsionRFID.ListaTag filtrarListadoTagEpc(GS1.PsionRFID.ListaTag listaTag)
        {
            GS1.PsionRFID.ListaTag listaTagResultado = new GS1.PsionRFID.ListaTag();

            foreach (GS1.PsionRFID.Tag tag in listaTag)
            {
                // Validar que sea una etiqueta con la cabecera de servir
                if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
                {
                    if (!esRepetido(listaTagResultado, tag.Epc))
                    {
                        listaTagResultado.Add(tag);
                    }
                }
            }

            return listaTagResultado;
        }

        private bool esRepetido(GS1.PsionRFID.ListaTag listaTag, string epc)
        {
            bool resultado = false;

            foreach (GS1.PsionRFID.Tag tag in listaTag)
            {
                if (tag.Epc.Equals(epc))
                {
                    resultado = true;
                    break;
                }
            }

            return resultado;
        }
        #endregion
    }
}